package chapter_22.file;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.Date;

/**
 * Created by Administrator
 * Created time 2018/8/8 19:26.
 * File 类部分不常用方法测试
 */
public class FileTest {

    public static void main(String[] args) {

        /*
         程序运行前,判断上次运行后的"重命名文件"是否存在
         如果文件存在,则恢复重命名
         */
        File renameFile = new File("./src/chapter_22/file/rename_file.txt");
        if (renameFile.exists()) {
            renameFile.renameTo(new File("./src/chapter_22/file/file.txt"));
        }

        // 文件对象
        File file = new File("./src/chapter_22/file/file.txt");
        // 目录对象
        File fileDir = new File("./src/chapter_22/file/");

        fileOperat(file);// 文件操作
        getFileAndDir(fileDir);// 目录操作
        getFileAndDirWithFilenameFilter(fileDir);// 目录操作
        getFileAndDirWithFileFilter(fileDir);// 目录操作

    }

    /**
     * 文件操作方法
     * @param file 文件对象参数
     */
    private static void fileOperat(File file){

        System.out.println("-------------------------文件操作------------------------");

        System.out.println("当前文件的绝对路径: " + file.getAbsolutePath());// 获取文件的绝对路径
        System.out.println("当前文件的上级目录路径: " + file.getParent());// 获取文件的上级目录路径

        System.out.println("当前文件是否可写: " + file.canRead());// 测试当前文件是否可写
        System.out.println("当前文件是否可读: " + file.canWrite());// 测试当前文件是否可读

        System.out.println("当前文件的最后修改时间: " + new Date(file.lastModified()));// 当前文件的最后修改时间(毫秒数)
        System.out.println("当前文件的长度: " + file.length());// 获取文件的长度(以字节为单位)
        // 文件重命名(可移动文件)
        file.renameTo(new File("./src/chapter_22/file/rename_file.txt"));

        System.out.println("-------------------------文件操作------------------------");
    }

    /**
     * 1.获取当前目录下的目录和文件
     * @param fileDir 文件参数对象
     */
    private static void getFileAndDir(File fileDir){
        System.out.println("-------------------------目录操作------------------------");

        String[] strArray = fileDir.list();
        System.out.print("[" + fileDir.getPath() + "]目录下的所有文件: ");
        for (String s : strArray) {
            System.out.print(s + "; ");
        }
        System.out.println("");

        System.out.println("-------------------------目录操作------------------------");
    }

    /**
     * 2.获取当前目录下的目录和文件(带过滤 FilenameFilter)
     * @param fileDir 文件参数对象
     */
    private static void getFileAndDirWithFilenameFilter(File fileDir) {
        System.out.println("-------------------------目录操作------------------------");

        String filter = "file";// 文件过滤标识
        FilenameFilter filenameFilter = (File dir, String name) -> {
            // true 表示显示| false 表示过滤
            if (name.startsWith(filter)) {
                return true;
            } else {
                return false;
            }
        };

        String[] strArray1 = fileDir.list(filenameFilter);
        System.out.print("[" + fileDir.getPath() + "]目录下的过滤后的文件: ");
        for (String s : strArray1) {
            System.out.print(s + "; ");
        }
        System.out.println("");

        System.out.println("-------------------------目录操作------------------------");
    }

    /**
     * 3.获取当前目录下的目录和文件(带过滤 FileFilter)
     * @param fileDir 文件参数对象
     */
    private static void getFileAndDirWithFileFilter(File fileDir) {
        System.out.println("-------------------------目录操作------------------------");

        // String dirFilter = "file";// 文件过滤标识
        FileFilter fileFilter = (File pathname) -> {
            return pathname.isDirectory();
        };
        File[] fileArray = fileDir.listFiles(fileFilter);
        System.out.print("[" + fileDir.getPath() + "]目录下的所有文件夹: ");
        for (File f : fileArray) {
            System.out.print(f.getName() + "; ");
        }
        System.out.println("");

        System.out.println("-------------------------目录操作------------------------");
    }

}
